<?php

/**
 * 返回当前日期
 * @modify trainyao 2015-09-26 创建
 * @param string $format  日期格式,默认Y-m-d
 * @return string
 */
function getCurrentDate($format = 'Y-m-d') {
    return date($format);
}

/**
 * 返回当前时间的时间戳
 * @modify trainyao 2015-09-26 创建
 * @return integer
 */
function getCurrentTimestamp() {
    return time();
}

/**
 * 返回当前时间
 * @modify trainyao 2015-09-26 创建
 * @param string $format  时间格式,默认Y-m-d H:i:s
 * @return string
 */
function getCurrentTime($format = 'Y-m-d H:i:s') {
    return date($format);
}

/**
 * 返回几个月后的时间
 * @param date $startTime  2015-09-12 12:00:00
 * @param int $months  月数
 */
function getFutureTime($startTime, $months) {
    $temp_startTime = strtotime($startTime);
    $result_endTime = strtotime("+" . $months . " months", $temp_startTime);
    return date("Y-m-d H:i:s", $result_endTime);
}

/**
 * 返回时间周期字符串
 * @param type $time_string
 * @return type
 */
function getTimeCycle($time_string) {
    $array = array(0 => '星期日', 1 => '星期一', 2 => '星期二', 3 => '星期三', 4 => '星期四',
        5 => '星期五', 6 => '星期六');
    $time_arr = explode(',', $time_string);
    $return_string = '';
    for ($i = 0; $i < count($time_arr); $i++) {
        $return_string.=$array[$time_arr[$i]] . ',';
    }
    return empty($return_string) ? '' : substr($return_string, 0, -1);
}

/**
 * 获取两个时间戳之间的间隔，以给定的单位返回，默认单位为分钟
 * @param  integer $startTime
 * @param  integer $endTime
 * @param  string $format    默认为'minute'
 * @return int 向下取整，不到1个单位算0个
 */
function getTimeDiff($startTime, $endTime, $format = 'minute') {
    $divisor = 1;
    switch ($format) {
        case 'day':
            $divisor = $divisor * 60 * 60 * 24;
            break;
        case 'hour':
            $divisor = $divisor * 60 * 60;
            break;
        case 'second':
            $divisor = 1;
            break;
        case 'minute':
            $divisor = 60;
            break;
        default:
            $divisor = 60;
            break;
    }

    return floor(($endTime - $startTime) / $divisor);
}

/**
 * 检测时间字符串格式是否正确
 * @param  string $str    输入的时间字符串
 * @param  string $format 时间格式
 * @return boolean
 */
function checkTimeStrFormat($str, $format = 'Y-m-d H:i:s') {
    $formatStr = date($format, strtotime($str));
    return $formatStr == $str;
}

/**
 * 比较两个时间字符串的先后
 * @param  string $time
 * @param  string $compare
 * @return boolean
 */
function isBeforeTime($time, $compare, $equal = false) {
    if ($equal !== false) {
        return strtotime($time) <= strtotime($compare);
    }
    return strtotime($time) < strtotime($compare);
}

/**
 * 比较时间是否在时间段内
 * @modify trainyao 2016-01-08 创建
 * @param  string   $time      比较时间
 * @param  string   $startTime 开始时间
 * @param  string   $endTime   结束时间
 * @return boolean             是否在时间段内
 */
function isBetweenTime($time, $startTime, $endTime) {
    $time = is_numeric($time) ? $time : strtotime($time);
    $startTime = is_numeric($startTime) ? $startTime :  strtotime($startTime);
    $endTime = is_numeric($endTime) ? $endTime :  strtotime($endTime);

    return ($startTime <= $time && $time <= $endTime);
}

/**
 * 返回预定开始时间
 * @param date $date 格式:date('Y-m-d') 如果格式是Y-m-d H:i:s 直接返回 
 * @return string
 */
function getOrderStartTime($date) {
    if (strlen($date) > 10) {
        return date('Y-m-d H:i:s', strtotime($date));
    }
    return $date . " 00:00:00";
}

/**
 * 返回预定结束时间
 * @param date $date 格式：date('Y-m-d') 如果格式是Y-m-d H:i:s 加上小时返回
 * @param integer $nights 预定天数
 * @return string
 */
function getOrderEndTime($date, $nights, $hour) {
    if (strlen($date) > 10) {
        return date('Y-m-d H:i:s', strtotime($date) + $hour * 60 * 60);
    }
    return date('Y-m-d', strtotime($date) + $nights * 24 * 60 * 60) . " 00:00:00";
}

/**
 * 根据开始结束时间获取过了多少晚
 * @modify trainyao 2016-01-23 创建
 * @param  string   $startDate 开始时间
 * @param  string   $endDate   结束时间
 * @return integer              过了几晚
 */
function getNight($startDate, $endDate) {
    if (!is_numeric($startDate)) {
        $startDate = strtotime($startDate);
    }
    if (!is_numeric($endDate)) {
        $endDate = strtotime($endDate);
    }

    $night = round(($endDate - $startDate) / 86400);

    return ($night < 0) ? 0 : $night;
}

/**
 * 比较时间段一与时间段二是否有交集
 * @modify trainyao 2016-01-14      代码调整后无调用暂时删除方法
 * @param type $begintime1
 * @param type $endtime1
 * @param type $begintime2
 * @param type $endtime2
 * @return boolean
 */
// function isMixTime($begintime1, $endtime1, $begintime2, $endtime2) {
//     $status = $begintime2 - $begintime1;
//     if ($status > 0) {
//         $status2 = $begintime2 - $endtime1;
//         if ($status2 > 0) {
//             return false;
//         } else {
//             return true;
//         }
//     } else {
//         $status2 = $begintime1 - $endtime2;
//         if ($status2 > 0) {
//             return false;
//         } else {
//             return true;
//         }
//     }
// }

/**
 * 检查开始结束时间是否存在交叉
 * @modify trainyao 2016-01-14 创建
 * @param  array   $timeArray 时间数组,array($startTime => $endTime, $startTime2 => $endTime2)
 * @param  string   $startTime 开始时间
 * @param  string   $endTime   结束时间
 * @param  integer   $orderRoomId   子订单id,新增订单时该值为null
 * @return mixin               无交叉返回新时间数组,有交叉返回false
 */
function checkTimeCross($timeArray, $startTime, $endTime, $orderRoomId) {
    // 开始时间重合,必定存在交叉
    if (!empty($timeArray[$startTime])) {
        $dbOrderRoomId = $timeArray[$startTime]['order'];
        if (empty($dbOrderRoomId) || (!empty($dbOrderRoomId) && $dbOrderRoomId != $orderRoomId)) {
            return false;
        }
    }

    $timeArray[$startTime]['end'] = $endTime;
    ksort($timeArray);
    $startTimes = array_keys($timeArray);
    $endTimes = array_values($timeArray);
    // 找出开始时间在众多开始时间内的顺序
    $number = array_search($startTime, $startTimes);
    $preIndex = $number-1;
    $nxtIndex = $number+1;
    // 判断是否被前一个时间交集到
    if ($preIndex >= 0 && !empty($endTimes[$preIndex]['end']) && $endTimes[$preIndex]['end'] > $startTime) {
        if ($endTimes[$preIndex]['order'] != $orderRoomId) {
            return false;
        }
    }

    // 判断是否交集到后一个时间
    if (!empty($startTimes[$nxtIndex]) && $endTime > $startTimes[$nxtIndex]) {   
        // 第一个if:新增子订单时,有可能出现时间冲突,$endTimes[$nxtIndex]['order'] 和 $orderRoomId 都是null,要判断为时间时间冲突
        // 第二个if:修改同一个子订单时,不判断为时间冲突($endTimes[$nxtIndex]['order'] == $orderRoomId)
        // 第二个if:修改订单时,修改不同子订单($endTimes[$nxtIndex]['order'] != $orderRoomId),时间冲突,返回false
        if (!isset($endTimes[$nxtIndex]['order']) && is_null($orderRoomId)) {
            return false;
        }
        if ($endTimes[$nxtIndex]['order'] != $orderRoomId) {
            return false;
        }
    }
    return $timeArray;
}

/**
 * 根据两个时间字符串，计算出具体的日期数组返回
 * @modify AmosZhong 2016-01-26 创建
 */
function getDatesBetweenTime($startDate, $endDate, $endDateRequired = false) {
    $result = array();
    $startTime = strtotime($startDate);
    $endTime = strtotime($endDate);

    if ($endDateRequired) {
        while ($startTime <= $endTime){
            array_push($result, date('Y-m-d', $startTime));
            $startTime = strtotime('+1 day',$startTime);
        }
    } else {
        while ($startTime < $endTime){
            array_push($result, date('Y-m-d', $startTime));
            $startTime = strtotime('+1 day',$startTime);
        }
    }

    return $result;
}

/**
 * 根据开始结束时间获取每天不一样的价格  计算总价
 * @modify wenhui 2016-12-21 创建
 * @modify zhangzhen 2017-3-15 重构
 * @param  string   $startDate 开始时间
 * @param  string   $endDate   结束时间
 * @param  bool   $typePrice   价格类型
 * @return array
 */
function getAllPrice($roomTypeId, $startDate, $endDate, $typePrice = false) {

    $night = getNight($startDate, $endDate);//几天
    $startDate =  strtotime($startDate);  //int
    $endDate = strtotime($endDate) - 86400; //int

    $roomTypeModel = D('RoomType');
    $roomTypeInfo = $roomTypeModel->getInfo($roomTypeId);
    $discount = ($roomTypeInfo['discount'])/10;  //折扣
    if (empty($roomTypeInfo)) {
        returnJson(500, 504,null);
    }
    $i = 0;

    // hotelRoomTypePrice表中的price是预定价格  不用打折
    $hotelRoomTypePriceModel = D('HotelRoomTypePrice');
    $hotelRoomTypePriceList = $hotelRoomTypePriceModel->getPriceList($roomTypeId, $startDate, $endDate);
    $hotelRoomTypePriceList = array_column($hotelRoomTypePriceList, 'price', 'price_date');
    if ($typePrice) {
       $hotelRoomTypePriceList = array();
    }

    // 从RoomTypePrice表中获取 已设置的门市价格 门市价格要打折计算
    $roomTypePriceModel = D('RoomTypePrice');
    $roomTypePriceList = $roomTypePriceModel->getPriceList($roomTypeId, $startDate, $endDate);
    $roomTypePriceList = array_column($roomTypePriceList, 'price', 'price_date');
    if ($startDate < time()) {
        // 尾房价格
        $lastRoomPriceModel = D('LastRoomPrice');
        $lastRoomPriceInfo = $lastRoomPriceModel->getInfoByRoomType($roomTypeId, $startDate);
        if(!empty($lastRoomPriceInfo)){
            $start = $lastRoomPriceInfo['startdate'];
            $end = $lastRoomPriceInfo['enddate'];
            $startToEnd = ($end - $start)/86400;

            $startTime = $lastRoomPriceInfo['starttime'];
            $endTime = $lastRoomPriceInfo['endtime'];

            $currentTime = date('G');

            if($startToEnd > 0 && $startTime > $endTime ){
                $tempTime = 0;//是否跨日期
            }
            if(isset($tempTime)){
                if( $startTime <= $currentTime && $currentTime < 24 || $tempTime < $endTime && $endTime > $currentTime){
                    $hasLastRoom = true;
                }
            }elseif ($startTime <= $currentTime && $currentTime < $endTime) {
                $hasLastRoom = true;
            }
        }
    }
    $priceList = array();
    $totalPrice = 0.00;
    for ($timestamp = $startDate; $timestamp <= $endDate; $timestamp += 86400) { 
        if($timestamp == $startDate && $hasLastRoom){
            $totalPrice = $roomTypePriceList[$timestamp] ? $roomTypePriceList[$timestamp] : $roomTypeInfo['price'];
            $totalPrice -= $lastRoomPriceInfo['price'];
            if ($typePrice) {
                $priceListItem = isset($roomTypePriceList[$timestamp]) ? (($roomTypePriceList[$timestamp]*1000)/1000) : $roomTypeInfo['price'];
                array_push($priceList, $priceListItem);
            } else {
                array_push($priceList, $totalPrice);
            }
            continue;
        }
        if(isset($hotelRoomTypePriceList[$timestamp])){
            $totalPrice += $hotelRoomTypePriceList[$timestamp];
            array_push($priceList, $hotelRoomTypePriceList[$timestamp]);
        } else if(isset($roomTypePriceList[$timestamp])) {
            $totalPrice += (($roomTypePriceList[$timestamp]*1000)/1000) * $discount;
            if ($typePrice) {
                array_push($priceList, (($roomTypePriceList[$timestamp]*1000)/1000));
            } else {
                array_push($priceList, (($roomTypePriceList[$timestamp]*1000)/1000) * $discount);
            }
        } else {
            $totalPrice += (($roomTypeInfo['price']*1000)/1000) * $discount;
            if ($typePrice) {
               array_push($priceList, (($roomTypeInfo['price']*1000)/1000));
            } else {
               array_push($priceList, (($roomTypeInfo['price']*1000)/1000) * $discount);
            }
        }
    }    
    return array('totalPrice' => number_format($totalPrice, 2 ,'.', ''), 'priceList' => $priceList);

}
